Code Reading
#WIP
できるだけ高速にコードの構造を把握する
文字情報だけを読んでコードを解読するのは効率が悪い
文字情報というのは、コード、ドキュメント、ディレクトリ構造、など
あたりまえ体操だがmrsekut.icon
フロントエンドのコードも、
いったんプロダクトのUIを見てから読むとの、コードだけを読んでUIもイメージするのとでは雲泥の差がある
やっぱり関係性が可視化できるのがデファクトスタンダードとして存在していて欲しい
形式的に解析しなくても、AIに丸ごとツッコんでAjaxばりに部分的に可視化するとかできんかな
最初にやりたいこと
全体像を知る
アーキテクチャを知る
これをやらないと、読みたい対象がどこにあるのかがわからない
ディレクトリ構造から類推する
型を理解する
スコープが、大きめにも、小さめにも
これができるかどうかは、コードリーティングしたい対象の良さに依存する
型駆動で開発されているとかなり理解しやすい
参考
プログラマー脳
/mrsekut-book-4798068535/021 (Part 1 コードをよりよく読むために)
/mrsekut-book-4798068535/097 (Part 2 コードについて考える)
サクッと読んでるときはさほどだったが、code readingに悩んでいるタイミングで読むとなにかヒントがあるかも
抽象部分から読む
認知的リファクタリングしながら読む
codeを読まずに、commit messageを読んでいく
ChatGPTに聞く
コードをコピペしても良いし、GitHubのURLを投げて読んでもらっても良い
GitLensの機能はもっとどしどし使っていったほうが良さそうmrsekut.icon
そのcommit (変更)が行われたPRを確認するとかは後から追いかけるのに良い
GitHub repoをサクッとコードリーディングする
今となってはRemote Repositoriesの方が便利mrsekut.icon
ワーキングメモリに過負荷をかけるパターン
/mrsekut-book-4798068535/088 (4.3 ワーキングメモリに負荷がかかっているときに使える記憶補助ツール)
コードのどの部分を読めばよいかわからない
無駄に詳細に読んでしまう
詳細に読むか流れを読むかの決定に迷う
ある関数Aを読んでる時に、知らない関数Bが使われているのを発見した時に、
そのままAを読み続けるか、
いったんBに入り込むか
を迷ってしまう
依存関係グラフを作成する
/mrsekut-book-4798068535/089
印刷して、変数に丸をつけて、同じものを結ぶ
視覚的に見ようねという感じ
状態遷移表を書く
/mrsekut-book-4798068535/091
Python Tutor
https://pythontutor.com/
JSとかも使える
/mrsekut-book-4798068535/109 (5.3 プログラムに関する知識を深める)
テキスト構造の理解
ミクロ
変数の役割を考えるとか
計画の理解
マクロ
この関数が書かれた目的を考える
#??
やりたいこと、欲しいツール
読んでる最中にアノテーションメモを残したい
1ファイルが大きい時に邪魔な関数等を非表示にしたい
VSCodeならcmd-alt-[などで折り畳めるが、そういう次元の話ではなく
Scrapboxでメモしながらcode readingする
さっそくコードを読むのではなくファイルツリーから概要を掴む
各featureのコードの行数を算出する
どこが複雑なのか、コアなのか、重要なのか、といった判断ができる
名前などから類推しながら、中を軽く読んでいく
features/直下の各featureのボリュームを概観する
/miyamonz-projects/コードリーディングを支援するツール
このノートに限らず、このプロジェクト内にいろいろ知見がある
可視化する
“Fingerprint” the structure of a GitHub repo
Semgrep
CodeTour
https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour
vscode拡張
コードを汚さずにメモを取れる
入れてないmrsekut.icon
とりあえず全部流し見する。
どんな関数やクラスがあるのか、この作者はどのような感じのプログラムを書くのかなどの傾向を把握する
コメントは読みましょう
速く読もうと意識して読むのが良い.
速く読もうとしなければ速く読めるようにはならない
読むときに仮設と検証を行う
コードにコメントを追加する
コメントを追加しながら読む
理解とともにコメントは増やしていく
アノテーションコメントを残す
解決すべき課題、確認すべき仕様、改善すべき箇所などは # TODO: など、アノテーションコメントを残す
ファイル配置を手がかりにする
ソフトウェアの種類によっては、典型的なファイル配置が決まっていることがある
なのでそのディレクトリ構成やファイル名を辿ることで全体像をつかむことができる
メソッドの最終行に注目する
オブジェクト指向のプログラムは、メソッドの前半に実行に必要な変数などの下処理を行い、
後半に実際に実行処理を行うケースが多いから。
rexdep
Madge
Doxygen
ひらメソッド
動的な解析
デバッガなどを使って実行時の動きを追う
ツール http://i.loveruby.net/ja/misc/readingcode.html
静的な解析
ドキュメントを読む
'hacking','tour'などのキーワードがあれば要チェック
ディレクトリ構造を読む
ファイル構成を読む
ファイル中の関数名も合わせて、どの程度の単位でファイル分割されているかを確認
関数の命名などもチェック
略語の調査
関数同士の呼び出し関係
関数が多い場合は特に重要
図に書く
関数を読む
mainのようなルートっぽいところからたどっていく
「なにを読まないか」をよく考える
書き換えて動かす
ツール http://i.loveruby.net/ja/misc/readingcode.html
Nimのparserを読んでて思ったこと
巨大な(2000行ほど)のコードをコアな部分を写経しながら、もっとシンプルなものを作ってみようとすると、理解しやすいと感じた
コードを読むときは目標を決めて重点的に読もう
新しいコーディングスタイルを学ぶのか?
何かの要件を満たす方法を知りたいのか?
etc
関数
名前から機能を推測する
関数の冒頭に書かれているコメントを読む
関数の使われ方を調べる
本体のコードを読む
関連ドキュメントを調べる
コードリーディングハンズオン
他人の書いたコードに挑もう – Part 1 | POSTD
その目的のコードが今もメンテされているかは少し注目
メンテされていれば、動くことが保証される
最低限必要なもの
「ファイル名」から中身を予想する勘と経験
Go to Definition
その言語の基礎文法
その他思ったこと
クラスの継承が多く見られるときはgraphvizなどで図示しておくと良さそう
追加したいものを周りのコードを見比べながら進めるので、したいことによっては0から作るよりずっと簡単
クラスや関数の呼び出しがスタックされる場合も図示しておくと良さそう
プロジェクトを作っている組織へ途中から入りちょっとずつ知っていくあの感じにすごく似てた
関連
http://yasuho.hatenablog.com/entry/20060512/p1
https://www.slideshare.net/satorutakeuchi18/viewing-source-code
http://dev.ariel-networks.com/wp/documents/arielarea-study/code-reading 未読
http://i.loveruby.net/ja/misc/readingcode.html
コードの読み方、動的、静的な解析ツールの詳解
DBの設計を把握しよう
https://speakerdeck.com/rshindo/jjug-ccc-2019-fall
mizchi氏のコードリーディングメモ
https://gist.github.com/mizchi/31e5628751330b624a0e8ada9e739b1e
https://speakerdeck.com/k1low/phperkaigi-2020
途中からプロジェクトに参加するとき
https://www.slideshare.net/satorutakeuchi18/viewing-source-code
/miyamonz-projects/コードリーディングのテクニック